iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0

Given the head of a singly linked list, reverse the list, and return the reversed list.

給定一個單鏈表的頭節點,請反轉該鏈表後並回傳反轉後的單鏈表。

https://ithelp.ithome.com.tw/upload/images/20240910/20168667InSKylf4Bm.png
https://ithelp.ithome.com.tw/upload/images/20240910/201686674JXG5DG0rt.png


本來想說直接挑戰 92.Reverse Linked List II,結果發現根本越級打怪,馬步還沒練好就想要飛簷走壁,只好先回頭寫基本題。

步驟

  1. 當前節點為current、當前節點的前一個節點為prev,前一節點prev為null,如下圖
    https://ithelp.ithome.com.tw/upload/images/20240910/20168667p2Q1A9r8PE.png

  2. 利用while loop進行每一個指針的反轉,條件是只要當前節點不是null就進行反轉操作

    • 第一步、因為一旦反轉指針,當前節點的下一個節點就會遺失記錄(因為會變成沒有節點指向它,沒有人知道它在哪,所以要先把它(next)的位置存起來,可以從下圖看到灰色虛線箭號就是反轉後前的指針方向)
      https://ithelp.ithome.com.tw/upload/images/20240910/20168667j5BwIhaEiY.png

    • 第二步、反轉指針,把原本指向next的指針,指向prev,從上圖可以看到紅色箭號就是反轉後的指針

    • 第三步、反轉指針完成後,要接著移動下一個指針,但是在移動前,我們要先更新所有current、prev、next的相對位置。原本prev會變成新的current,原本的current會變成新的next(其實就是三個一起往linked list的尾端移動,如下圖)
      https://ithelp.ithome.com.tw/upload/images/20240910/20168667dhtrD039xp.png

    • 重複以上步驟
      https://ithelp.ithome.com.tw/upload/images/20240910/20168667XVetxqq2lj.png

  3. 全部指針反轉完成後,prev會在linked list(鏈表)的頭節點,這時回傳prev,如下圖
    https://ithelp.ithome.com.tw/upload/images/20240910/20168667ERtPXhPWse.png

var reverseList = function(head) {
    let prev = null;
    let current = head;
    
    while (current) {
        let next = current.next; // 暫存當前節點的下一個節點
        current.next = prev;     // 將當前節點的指針指向前一個節點
        prev = current;          // 更新 prev 為當前節點
        current = next;          // 移動到下一個節點
    }

    return prev; // 回傳反轉後的新頭節點
};

上一篇
[Day28] Patterns: In-place reversal of linked list(原地反轉列表)
下一篇
[Day30] Reverse Linked List II
系列文
刷題筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言